//!
/**
***********************************************************************************************************
* <RBBSPREader Implementation>
***********************************************************************************************************
* @file RBBSPREader.cpp
***********************************************************************************************************/

/***********************************************************************************************************
* Precompiled Header
***********************************************************************************************************/
#include "RBMainPCH.h"


/***********************************************************************************************************
* Includes
***********************************************************************************************************/
#include "RBBSPREader.h"

#include "RBFile.h"

/**
***********************************************************************************************************
* Constructor
***********************************************************************************************************/
RBBSPREader::RBBSPREader()
{
}

/**
***********************************************************************************************************
* Destructor
***********************************************************************************************************/
RBBSPREader::~RBBSPREader()
{
}

static const int32 supported_version = 21;
static const int32 HEADER_LUMPS = 64;

#define IDBSPHEADER	(('P'<<24)+('S'<<16)+('B'<<8)+'V')

struct lump_t
{
    int	version;	// lump format version
    int	fileofs;	// offset into file (bytes)
    int	filelen;	// length of lump(bytes)
    char	fourCC[4];	// lump ident code
};

struct dheader_t
{
    int32	ident;                // BSP file identifier
    int32	version;              // BSP file version
    lump_t	lumps[HEADER_LUMPS];  // lump directory array
    int32	mapRevision;          // the map's revision (iteration, version) number
};

/**************************************************************************************************************************************************************
 * 
 **************************************************************************************************************************************************************/
RBStream* RBBSPREader::Load(const RBString& strFilename)
{
    RBRenderer* pRenderer = RBRenderer::GetSingleton();
    RBStream* pStream = 0;

    RBFile* pFile = RBFile::Open(strFilename.c_str());

    if (pFile != NULL)
    {
        dheader_t header;
        pFile->ReadStruct(&header);
        RBAssert(header.ident==IDBSPHEADER, "only little endian supported");
        RBAssert(header.version==supported_version, "unsupported version");

        lump_t lumps[HEADER_LUMPS];
        pFile->ReadStruct(lumps, HEADER_LUMPS);
        UNUSED(lumps);
    }
    
    RBFile::Close(pFile);

    return pStream;
}

